package com.huawei.esdk.tp.business.professional.sitemgr;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.huawei.esdk.platform.common.SDKErrorCode;
import com.huawei.esdk.platform.common.SDKResult;
import com.huawei.esdk.platform.common.exception.SDKException;
import com.huawei.esdk.platform.common.utils.StringUtils;
import com.huawei.esdk.tp.base.BaseService;
import com.huawei.esdk.tp.common.ErrInfo;
import com.huawei.esdk.tp.domain.model.Site;
import com.huawei.esdk.tp.domain.model.SiteInfoCommService;
import com.huawei.esdk.tp.domain.model.bean.CameraControl;
import com.huawei.esdk.tp.domain.model.bean.PagedList;
import com.huawei.esdk.tp.domain.model.bean.QuerySites;
import com.huawei.esdk.tp.domain.model.bean.VideoSourcesInfo;

public class SiteMgrService extends BaseService
{
    private static final Logger LOGGER = Logger.getLogger(SiteMgrService.class);

    private SiteInfoCommService siteInfoCommService;

    public SiteInfoCommService getSiteInfoCommService()
    {
        return siteInfoCommService;
    }

    public void setSiteInfoCommService(SiteInfoCommService siteInfoCommService)
    {
        this.siteInfoCommService = siteInfoCommService;
    }

    public SDKErrorCode ctrlCameraEx(String siteUri, CameraControl parameters)
            throws SDKException
    {
        SDKErrorCode result = new SDKErrorCode();
        // 校验会场Uri的有效性
        if (StringUtils.isEmpty(siteUri))
        {
            LOGGER.debug("siteUri is empty");
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }
        // 准备Model
        Site site = new Site();
        site.setUri(siteUri);
        // 调用Model
        result = site.getCamera().ctrlCameraOpeate(parameters);
        return result;
    }

    /**
     * 查询视频输入口接入视频源状态
     * 
     * * @param siteUri /** * @return
     */
    public SDKResult<List<VideoSourcesInfo>> queryVideoOutSrcStateEx(
            String siteUri) throws SDKException
    {
        SDKResult<List<VideoSourcesInfo>> result = new SDKResult<List<VideoSourcesInfo>>();
        // 校验会场Uri的有效性
        if (StringUtils.isEmpty(siteUri))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }
        // 准备Model
        Site site = new Site();
        site.setUri(siteUri);
        // 调用Model
        result = site.getStreamOperator().queryVideoOutSrcState();
        return result;
    }

    /**
     * 查询是否接入辅流输入源 * @param siteURI 会场uri /** * @return SDKResult
     * @throws SDKException
     */
    public SDKResult<Integer> isConnectAuxStreamEx(String siteURI)
            throws SDKException
    {
        SDKResult<Integer> result = new SDKResult<Integer>();
        if (StringUtils.isEmpty(siteURI))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }
        Site site = new Site(siteURI);
        result = site.getStreamOperator().isConnectAuxSource();

        return result;
    }

    /**
     * 查询是否正在发送辅流 * @param siteURI 会场uri /** * @return SDKResult
     * @throws SDKException
     */
    public SDKResult<Integer> isSendAuxStreamEx(String siteURI)
            throws SDKException
    {
        SDKResult<Integer> result = new SDKResult<Integer>();
        if (StringUtils.isEmpty(siteURI))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }
        Site site = new Site(siteURI);
        result = site.getStreamOperator().isSendAuxStream();
        return result;
    }

    public SDKResult<Integer> isReceiveRemAuxStrmEx(String siteURI)
            throws SDKException
    {
        SDKResult<Integer> result = new SDKResult<Integer>();
        if (StringUtils.isEmpty(siteURI))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }
        Site site = new Site(siteURI);
        result = site.getStreamOperator().isReceiveRemAuxStrm();
        return result;

    }

    /**
     * 设置开始或停止辅流发送 * @param siteURI /** * @param controlCode /** * @return
     * @throws SDKException
     */
    public SDKErrorCode setAuxStreamEx(String siteURI, Integer controlCode)
            throws SDKException
    {
        SDKErrorCode errorCode = new SDKErrorCode();
        if (StringUtils.isEmpty(siteURI))
        {
            errorCode.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return errorCode;
        }
        if (null == controlCode)
        {
            errorCode.setErrCode(ErrInfo.CONTROL_CODE_IS_NULL_ERRORCODE);
            return errorCode;
        }
        
        if (0 == controlCode)
        {
            Site site = new Site(siteURI);
            errorCode = site.getStreamOperator().startSendAuxStream();
        }
        else if (1 == controlCode)
        {
            Site site = new Site(siteURI);
            errorCode = site.getStreamOperator().stopSendAuxStream();
        }
        else
        {
            errorCode.setErrCode(ErrInfo.CONTROL_CODE_IS_INCORRECT_ERRORCODE);
        }
        
        return errorCode;
    }

    public SDKResult<Map<Integer, String>> queryAuxStreamSources(String siteURI)
            throws SDKException
    {
        SDKResult<Map<Integer, String>> result = new SDKResult<Map<Integer, String>>();
        if (StringUtils.isEmpty(siteURI))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }

        Site site = new Site(siteURI);
        result = site.getStreamOperator().getSubVideoSourceList();
        return result;
    }

    public int setMainAuxStreamSourcesEx(String siteUri, List<Integer> localMainSrcs,
            Integer localAuxSrc) throws SDKException
    {
        int result = 0;
        // 校验会场Uri的有效性
        if (StringUtils.isEmpty(siteUri))
        {
            result = ErrInfo.SITE_URI_ISNULL_ERRORCODE;
            return result;
        }
        // 准备Model
        Site site = new Site();
        site.setUri(siteUri);
        // 调用Model
        result = (int) site.getStreamOperator()
                .setLocalMainAux(localMainSrcs, localAuxSrc).getErrCode();
        return result;
    }

    public SDKResult<Map<Integer, String>> queryMainStreamSourcesEx(
            String siteUri) throws SDKException
    {
        SDKResult<Map<Integer, String>> result = new SDKResult<Map<Integer, String>>();

        // 校验会场Uri的有效性
        if (StringUtils.isEmpty(siteUri))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }

        // 准备Model
        Site site = new Site();
        site.setUri(siteUri);
        // 调用Model
        result = site.getStreamOperator().getMainVideoSourceList();

        return result;
    }

    public int setVideoOutSrcEx(String siteUri, Integer hdOut, Integer videoSrc)
            throws SDKException
    {
        int result = 0;

        // 校验会场Uri的有效性
        if (StringUtils.isEmpty(siteUri))
        {
            result = ErrInfo.SITE_URI_ISNULL_ERRORCODE;
            return result;
        }
        // 准备Model
        Site site = new Site();
        site.setUri(siteUri);
        // 调用Model
        result = (int) site.getStreamOperator()
                .changeVideoOutSrc(hdOut, videoSrc).getErrCode();

        return result;
    }

    public SDKResult<Site> querySiteVersionInfoEx(String siteUri)
            throws SDKException
    {
        SDKResult<Site> result = new SDKResult<Site>();
        if (StringUtils.isEmpty(siteUri))
        {
            result.setErrCode(ErrInfo.SITE_URI_ISNULL_ERRORCODE);
            return result;
        }

        Site site = new Site(siteUri);
        result = site.querySiteVersionInfo();
        return result;
    }
    
    public SDKResult<PagedList<Site>> querySitesByCondition(QuerySites querySites)
        throws SDKException
    {
        return Site.querySites(querySites);
    }

    public SDKErrorCode addSiteInfoEx(Site sitesInfo) throws SDKException
    {
        return sitesInfo.addSiteInfoEx();
    }

    public SDKErrorCode editSiteInfoEx(Site sitesInfo) throws SDKException
    {
        return sitesInfo.editSiteInfoEx();
    }
    
    public SDKErrorCode deleteSiteInfoEx(List<String> uris) throws SDKException
    {
        return new Site().deleteSiteInfoEx(uris);
    }
}
